//
//  ChivoxInnerEngine.m
//  ChivoxEngine
//
//  Created by xianchen.peng on 2018/8/28.
//  Copyright © 2018年 Chivox. All rights reserved.
//

#import "ChivoxService.h"
#import "ChivoxEmptyService.h"
#import "ChivoxLog.h"

@implementation ChivoxService

+ (ChivoxService *)create:(NSString *)type :(id<ChivoxServiceListener>)listener {
    if ([type isEqualToString:@"empty"]) {
        return [[ChivoxEmptyService alloc] init:listener];
    } else if ([type isEqualToString:@"ws"] || [type isEqualToString:@"wss"]) {
        return NULL;
    } else if ([type isEqualToString:@"http"] || [type isEqualToString:@"https"]) {
        return NULL;
    } else if ([type isEqualToString:@"native"]) {
        return NULL;
    } else {
        return NULL;
    }
}

#pragma mark - 构造方法

- (id)init {
    // 禁止调用默认构造方法
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}

- (id)init:(id<ChivoxServiceListener>)listener {
    // 只允许通过子类调用构造方法，使得本类成为抽象类
    if ([self isMemberOfClass:[ChivoxService class]]) {
        [self doesNotRecognizeSelector:_cmd];
        return nil;
    }
    
    if (self = [super init]) {
        self.listener = listener;
    }
    return self;
}

#pragma mark - 对事件发送的封装

- (void)fireLoadSuccess {
    if ([self.listener respondsToSelector:@selector(onLoadSucess:)]) {
        [self.listener onLoadSucess:self];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onLoadSucess:");
    }
}

- (void)fireLoadFail:(NSDictionary *)res {
    if ([self.listener respondsToSelector:@selector(onLoadFail:res:)]) {
        [self.listener onLoadFail:self res:res];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onLoadFail:res:");
    }
}

- (void)fireStartSuccess:(NSDictionary *)res {
    if ([self.listener respondsToSelector:@selector(onStartSuccess:res:)]) {
        [self.listener onStartSuccess:self res:res];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onStartSuccess:res:");
    }
}

- (void)fireStartFail:(NSDictionary *)res {
    if ([self.listener respondsToSelector:@selector(onStartFail:res:)]) {
        [self.listener onStartFail:self res:res];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onStartFail:res:");
    }
}

- (void)fireJsonResult:(NSDictionary *)res {
    if ([self.listener respondsToSelector:@selector(onJsonResult:res:)]) {
        [self.listener onJsonResult:self res:res];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onJsonResult:res:");
    }
}

- (void)fireBinResult:(NSDictionary *)res {
    if ([self.listener respondsToSelector:@selector(onBinResult:res:)]) {
        [self.listener onBinResult:self res:res];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onJsonResult:res:");
    }
}

- (void)fireErrorResult:(NSDictionary *)res {
    if ([self.listener respondsToSelector:@selector(onErrorResult:res:)]) {
        [self.listener onErrorResult:self res:res];
    } else {
        ChivoxLogWarn(@"[ChivoxService] listener not respondsToSelector onErrorResult:res:");
    }
}

#pragma mark - 子类必须重写的方法

- (void)load:(NSDictionary *)cfg {
    [self doesNotRecognizeSelector:_cmd];
}

- (void)start:(NSDictionary *)param {
    [self doesNotRecognizeSelector:_cmd];
}

- (void)feed:(NSData *)data {
    [self doesNotRecognizeSelector:_cmd];
}

- (void)stop:(NSDictionary *)param {
    [self doesNotRecognizeSelector:_cmd];
}

- (void)reset {
    [self doesNotRecognizeSelector:_cmd];
}

- (void)unload {
    [self doesNotRecognizeSelector:_cmd];
}



@end
